#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include<windows.h>
#include<time.h>

#define high 25     //定义游戏画面尺寸
#define width 50 
#define enemynum 5  //敌机数目 

//全局变量
int canvas[high][width]={0};  //二维数组记录游戏画面中对应的元素
//0输出空格，1输出飞机，2输出子弹，3输出敌机，4输出上下边框，5输出左右边框 
int position_x,position_y;  //飞机坐标位置 
int enemy_x[enemynum],enemy_y[enemynum]; //敌机坐标位置 
int score;                 //得分 
int bulletwidth;            //子弹宽度 
int enemymovespeed;         //敌机移动速度 

void gotoxy(int x,int y)//光标移动到（x，y）位置
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle,pos);
}

void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info = {1,0}; // 第二个值为0表示隐藏光标
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}

void satrtup()//数据初始化
{
	position_x=high/2;
	position_y=width/2;
	canvas[position_x][position_y]=1;
	
	int i;
	for(i=0;i<width;i++)
	{
		canvas[0][i]=4;
		canvas[high-1][i]=4;
	}
	for(i=0;i<high;i++)
	{
		canvas[i][0]=5;
		canvas[i][width-1]=5;
	}
		
	
	int k;
	for(k=0;k<enemynum;k++)
	{
		enemy_x[k]=rand()%2+1;
		enemy_y[k]=rand()%(width-2)+1;
		canvas[enemy_x[k]][enemy_y[k]]=3;
	} 
	bulletwidth=0; 
	enemymovespeed=20;
	score=0;
	
	HideCursor(); //隐藏光标 
}
void show()//显示画面
{
	gotoxy(0,0); // 光标移动到原点位置，以下重画清屏
	
	int i,j;
	for(i=0;i<high;i++)
	{
		for (j=0;j<width;j++)
		{
			if(canvas[i][j]==1)
				printf("*");  //输出飞机* 
			else if (canvas[i][j]==2)
				printf("|");  //输出子弹 
			else if (canvas[i][j]==3)
				printf("@");  //输出敌机@ 
			else if (canvas[i][j]==4)
				printf("-");
			else if (canvas[i][j]==5)
				printf("|");
			else
				printf(" ");   //输出空格 
		}
		printf("\n");
	}
	printf("得分：%d",score);
}
void updateWithoutInput()//与用户输入无关的更新
{
	int i,j,k;
	for(i=0;i<high;i++)
	{
		for (j=0;j<width;j++)
		{
			if (canvas[i][j]==2)  
			{
				for(k=0;k<enemynum;k++)
				{
					if(i==enemy_x[k]&&j==enemy_y[k])  //击中敌机 
					{
						if(score%10==0&&enemymovespeed>3&&score!=0)  //达到一定分数后敌机速度变快
							enemymovespeed--;
						if(score%10==0&&score!=0&&bulletwidth<5)     //达到一定分数后，子弹增加 
							 bulletwidth++;
						canvas[enemy_x[k]][enemy_y[k]]=0;
						enemy_x[k]=1;
						enemy_y[k]=rand()%(width-2)+1;
						canvas[enemy_x[k]][enemy_y[k]]=3;
						canvas[i][j]=0;
					
						score++;
					} 
				}
				
				//使得子弹自动向上移动 
				canvas[i][j]=0;
				if(i>1)
					canvas[i-1][j]=2;
			}
		}
	}
	
	for(k=0;k<enemynum;k++)
	{
		if(enemy_x[k]>high-3)   //敌机跑出下边界
		{
			canvas[enemy_x[k]][enemy_y[k]]=0;
			enemy_x[k]=1;
			enemy_y[k]=rand()%(width-2)+1;
			canvas[enemy_x[k]][enemy_y[k]]=3;
			
			score--;
		}
	}
	
	
	static int speed=0;
	if(speed<enemymovespeed)
		speed++;
	if(speed==enemymovespeed)
	{
		//敌机自动下落 
		for(k=0;k<enemynum;k++)
		{
			canvas[enemy_x[k]][enemy_y[k]]=0;
			enemy_x[k]++;
			canvas[enemy_x[k]][enemy_y[k]]=3;
		}
		speed=0;
	} 
}
void updateWithInput()//与用户输入有关的更新
{
	char input;
	if(kbhit()) 
	{
		input=getch();
		if(input=='a'&&position_y>1)
		{
			canvas[position_x][position_y]=0;
			position_y--;
			canvas[position_x][position_y]=1;
		}
		if(input=='d'&&position_y<width-2)
		{
			canvas[position_x][position_y]=0;
			position_y++;
			canvas[position_x][position_y]=1;
		}
		if(input=='w'&&position_x>1)
		{
			canvas[position_x][position_y]=0;
			position_x--;
			canvas[position_x][position_y]=1;
		}
		if(input=='s'&&position_x<high-2)
		{
			canvas[position_x][position_y]=0;
			position_x++;
			canvas[position_x][position_y]=1;
		}
		if(input==' ')
		{
			int left,right;
			left=position_y-bulletwidth;
			if(left<=0)
				left=1;
			right=position_y+bulletwidth;
			if(right>=width-1)
				right=width-2;
			int x;
			for(x=left;x<=right;x++)
				canvas[position_x-1][x]=2;
		} 
	}
}
int main() 
{
	satrtup();//数据初始化
    while(1)//游戏循环执行
	{
		show();//显示画面
		updateWithoutInput();//与用户输入无关的更新
		updateWithInput();//与用户输入有关的更新
	}
	return 0;
}
